﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CdgNetPersistencia.ClasesBases
{
    /// <summary>
    /// Clase base para utilerias de interaccion con ConectorBase de datos relacionales
    /// </summary>
    public abstract class ConectorBase
    {

        //PROPIEDADES DE LA CLASE
        protected string _cServidor { get; set; }
        protected int _nPuerto { get; set; }
        protected string _cServicio { get; set; }

        protected string _cUsuario { get; set; }
        protected string _cContrasena { get; set; }
        protected string _cCatalogo { get; set; }

        protected bool _bConectado { get; set; }
        protected bool _bMostrarSQL { get; set; }
    
        public const string ERROR_NO_HAY_FILAS= "NO HAY FILAS DEVUELTAS";

        /// <summary>
        /// Devuelve o establece el tiempo de espera para ejecución de comandos
        /// </summary>
        public int nTiempoComandos { get; set; }


        //CONSTRUCTOR
        public ConectorBase(string cUsuarioParam, string cContrasenaParam, string cServidorParam
                            , string cCatalogoParam, int nPuertoParam, string cServicioParam)
        {
            //asignamos los valores de los PROPIEDADES
            _cServidor = cServidorParam;
            _nPuerto = nPuertoParam;
            _cServicio = cServicioParam;

            _cUsuario = cUsuarioParam;
            _cContrasena = cContrasenaParam;
            _cCatalogo = cCatalogoParam;

        }

        /// <summary>
        /// Devuelve la representacion de la clase
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("<Acceso a BD: {0}@{1}:{2} >", _cCatalogo, _cServidor, _nPuerto);
        }

        /// <summary>
        /// Abre la conexion a la base de datos
        /// </summary>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lConectar();

        /// <summary>
        /// Cierra la conexion activa
        /// </summary>
        /// <returns>Lista de Resultados</returns>
        //public abstract List<object> lDesconectar();

        /// <summary>
        /// Cierra la conexion activa
        /// </summary>
        /// <param name="sender">Objeto que efectua la llamada al metodo</param>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lDesconectar(object sender);

        /// <summary>
        /// Ejecuta la sentencia sql
        /// </summary>
        /// <param name="cSentenciaSQL">Sentencia SQL a ejecutar</param>
        /// <returns>Lista de Resultados</returns>
        public List<object> lEjecutar_sentencia(string cSentenciaSQL)
        {
            return lEjecutar_sentencia(cSentenciaSQL, new object[0]);
        }

        /// <summary>
        /// Ejecuta la sentencia sql
        /// </summary>
        /// <param name="cSentenciaSQL">Sentencia SQL a ejecutar</param>
        /// <param name="aParametros">Arreglo de valores parametros</param>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lEjecutar_sentencia(string cSentenciaSQL, object[] aValores);

        /// <summary>
        /// Ejecuta la consulta sql y devuelve un DataTable como segundo elemento
        /// </summary>
        /// <param name="cConsultaSQL">Consulta SQL a ejecutar</param>
        /// <returns>Lista de Resultados</returns>
        public List<object> lEjecutar_consulta(string cConsultaSQL)
        {
            return lEjecutar_consulta(cConsultaSQL, new object[0]);
        }

        /// <summary>
        /// Ejecuta la consulta sql y devuelve un DataTable como segundo elemento
        /// </summary>
        /// <param name="cConsultaSQL">Consulta SQL a ejecutar</param>
        /// <param name="aParametros">Arreglo de valores parametros</param>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lEjecutar_consulta(string cConsultaSQL, object[] aValores);

        /// <summary>
        /// Ejecuta la consulta sql y devuelve un unico objeto valor
        /// </summary>
        /// <param name="cConsultaSQL">Consulta SQL a ejecutar</param>
        /// <returns>Lista de Resultados</returns>
        public List<object> lEjecutar_escalar(string cConsultaSQL)
        {
            return lEjecutar_escalar(cConsultaSQL, new object[0]);
        }

        /// <summary>
        /// Ejecuta la consulta sql y devuelve un unico objeto valor
        /// </summary>
        /// <param name="cConsultaSQL">Consulta SQL a ejecutar</param>
        /// <param name="aParametros">Arreglo de valores parametros</param>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lEjecutar_escalar(string cConsultaSQL, object[] aValores);

        /// <summary>
        /// Ejecuta el procedimiento almacenado y devuelve una lista de resultado
        /// </summary>
        /// <param name="cProcedimiento">Procedimiento Almacenado a ejecutar</param>
        /// <returns>Lista de Resultados</returns>
        public List<object> lEjecutar_procedimiento(string cProcedimiento)
        {
            return lEjecutar_procedimiento(cProcedimiento, new object[0]);
        }

        /// <summary>
        /// Ejecuta el procedimiento almacenado y devuelve una lista de resultado
        /// </summary>
        /// <param name="cProcedimiento">Procedimiento Almacenado a ejecutar</param>
        /// <param name="aParametros">Arreglo de valores parametros</param>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lEjecutar_procedimiento(string cProcedimiento, object[] aValores);

        /// <summary>
        /// Establece el metodo de Autoconfirmacion de transacciones
        /// </summary>
        /// <param name="bParam">Valor a asignar</param>
        public abstract void Set_autocommit(bool bParam);

        /// <summary>
        /// Inicia una transaccion
        /// </summary>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lIniciar_transaccion();

        /// <summary>
        /// Confirma una transaccion activa
        /// </summary>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lConfirmar_transaccion();

        /// <summary>
        /// Revierte una transaccion activa
        /// </summary>
        /// <returns>Lista de Resultados</returns>
        public abstract List<object> lRevertir_transaccion();

        /// <summary>
        /// Muestra el comando sql ejecutandose
        /// </summary>
        /// <param name="cComandoSQL">Comando sql a desplegar</param>
        protected void _Mostrar_SQL(string cComandoSQL)
        {
            //imprimimos el comando en la consola
            Console.WriteLine(string.Format("SQL -> \"{0}\"", cComandoSQL));
        }

    }

}
